Last updated on :August 28th, 2023 at 05:23 pm
やりたいこと:
PowerShellで特定のファイルを編集している時に他のユーザーやプログラムが同時に編集できないようにファイルにロックをかけたい。(読み取りはできるようにしたい。)
結論:
.NET Framework のSystem.IO.File クラスのOpenメソッドでオプションを指定して開く。
$filepath="C:\path\to\file.txt"
#編集ロック(別プロセスは読み込みのみ可で編集不可)
$filestream = [System.IO.File]::Open($filepath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::Read)
(処理)
#編集ロック解除
$filestream.Close()
解説:
.NET Framework FileCIassのOpenメソッドを使用してファイルを開くときにOpen(String, FileMode, FileAccess, FileShare)の形でオプション指定することで、ファイルを編集できないようにできる。また、編集ロック以外に他プロセスの読み込みや書き込みなどをコントロールすることが可能。 (参考: . NET Framework File Class)
各オプションについて:
- FileMode :開く/上書き/新規作成等ファイルの開き方を指定
- FileAccess :ファイルの読み書きについて指定
- FileShare :同じファイルを開く別プロセスのアクセス権を定義。
例外処理:
例外発生でプロセスが突然終了するとファイルロックがかかったままになってしまうので以下のように記述します。
$filepath="C:\path\to\file.txt"
$filestream = [System.IO.File]::Open($filepath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::Read)
try{
(処理)
}
finally{
$filestream.Close()
}
finally{}内のスクリプトは例外が起こった場合も通常通り終了する場合も実行されるのでロック解除し忘れを防ぐことができます。
付録:
FileStream Class : .NET FrameworkのStream Classから派生したクラス。同期/非同期処理に対応。
Stream Class: .NET FrameworkのSystem.IO名前空間に属する抽象クラス。全てのストリームの基底クラスとなる。ストリームはファイル・入出力デバイス・プロセス間通信・パイプ・TCP/ITンケッ ト等バイ トシーケンスを抽象化したもので、ストレージからの一つながりのデータの流れ。 .NET Franeworkではファイル・メモリ・ネットワークから読み取ったデータをストリームとして同様に扱うことが出来る。
参考サイト:
https://learn.microsoft.com/ja-jp/dotnet/api/system.io.file?view=net-7.0